/*!
 * \file Proyectable.h
 *
 * \date Jan 28, 2014
 * \author correa
 */
#ifndef PROYECCION_H_
#define PROYECCION_H_

#include <assert.h>
#include <Grafo.h>
#include <VertexSet.h>
#include <ProjectableVertexSet.h>

using namespace std;

#define VERDADERA 	0X01
#define FALSA		0x02

class Proyectable : public Grafo
{

	// Auxiliar para la proyeccion de cliques
	VertexSet *		_vecindadComun;
	VertexSet *		_vecinosUnidos;
	VertexSet *		_noVecinos;
	Lista *			_enumerablesII;
	VertexSet *		_subgrafo;		//!< usado internamente  en vários métodos
	VertexSet *		_complQ;
	SingleNodeSet *	_subnode;
	SingleNodeSet *	_falsonode;

	void initialize();
	void actualizarVecindades(const VertexSet &subgrafo, ProjectableCliqueSet& clique);
	void proyectarArista(VertexSet &clique);

public:
	Proyectable(int n);
	Proyectable(Proyectable &otro);
	Proyectable(Grafo &otro);
	Proyectable(string archivoDIMACS);
	virtual ~Proyectable();

	void copy(Grafo& otro);
	void copySubgrafo(const Grafo& otro, const VertexSet& subgrafo);

	virtual void addArista(int i, int j);
	void relajarClique(VertexSet &clique, const int u, Grafo& falso);
	bool proyectarClique(ProjectableCliqueSet &clique, const VertexSet &subgrafo, Grafo& falso);
	bool proyectarCliqueFuerte(ProjectableCliqueSet &clique, const VertexSet &subgrafo, Grafo& falso);
	void borrar(Grafo* falsog);
	void restituir(Grafo* falsog);
};

inline void Proyectable::addArista(int i, int j)
{
	Grafo::addArista(i,j);
}

#endif /* PROYECCION_H_ */
